如何使用Adaboost预测下一次营销活动的效果
内容编辑: 沐紫 公众号: 沐紫de学习日志
西安交通大学工商管理硕士在读,我会分享自己读研期间的习得及资料,包括Python、SPSS、Stata、雅思、论文基础理论与写作技巧,管理学案例··· 出处: https://github.com/weizhuang1113/MarketingCampaignResponse_Prediction
首先,Adaboost的基本原理是采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第N次迭代中,一共就有N个弱分类器,其中N-1个是以前训练好的,其各种参数都不再改变,本次训练第N个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前N-1个弱分类器没分对的数据,最终分类输出要看这N个分类器的综合效果。具体流程见下图:
我们都知道,企业往往会参考以往营销活动的经验对现有客户进行针对性地营销活动。我们可以利用Adaboost,在之前营销活动数据的基础上,得到此次营销活动将参与的会员客户名单及其参与意愿,制定针对性的营销策略,实现以有限的成本提高营销活动的效果。
数据内容
训练数据:3999条;测试数据:8843条
数据加载
import numpy as np
import pandas as pd
from sklearn.preprocessing importOneHotEncoder
from sklearn.model_selection importStratifiedKFold, cross_val_score
from sklearn.feature_selection importSelectPercentile, f_classif
from sklearn.ensemble importAdaBoostClassifier
from sklearn.pipeline importPipeline
from sklearn.metrics import accuracy_score
import warnings
warnings.filterwarnings("ignore")
train = pd.read_excel('order.xlsx', sheetname=0)
test = pd.read_excel('order.xlsx', sheetname=1)
train.head()
开头部分
train.tail()
结尾部分
train.describe()
对数据进行描述统计
去重
train.drop_duplicates(inplace=True)
缺失值处理
train.isnull().sum().sort_values(ascending=False)
test.isnull().sum().sort_values(ascending=False)
def na_replace(df):
na_rules = {'age': df['age'].mean(),
'total_pageviews': df['total_pageviews'].mean(),
'edu': df['edu'].median(),
'edu_ages': df['edu_ages'].median(),
'user_level': df['user_level'].median(),
'industry': df['user_level'].median(),
'act_level': df['act_level'].median(),
'sex': df['sex'].median(),
'red_money': df['red_money'].mean(),
'region': df['region'].median()
}
df = df.fillna(na_rules)
return df
train = na_replace(train)
test = na_replace(test)
独热编码
def symbol_con(df, enc_object=None, train=True):
convert_cols = ['edu', 'user_level', 'industry', 'value_level', 'act_level', 'sex', 'region']
df_con = df[convert_cols]
df_org = df[['age', 'total_pageviews', 'edu_ages', 'blue_money', 'red_money', 'work_hours']].values
if train == True:
enc = OneHotEncoder()
enc.fit(df_con)
df_con_new = enc.transform(df_con).toarray()
new_matrix = np.hstack((df_con_new, df_org))
return new_matrix, enc
else:
df_con_new = enc_object.transform(df_con).toarray()
new_matrix = np.hstack((df_con_new, df_org))
return new_matrix
X_train, enc = symbol_con(train, enc_object=None, train=True)
y_train = train['response']
X_test = symbol_con(test, enc_object=enc, train=False)
y_test = test['final_response']
建模
参数优化选择
transform = SelectPercentile(f_classif, percentile=50)
model_adaboost = AdaBoostClassifier()
from sklearn.model_selection importGridSearchCV, cross_val_score, StratifiedKFold, learning_curve
pipe=Pipeline([('select',transform),
('model_adaboost', model_adaboost)])
param_test = {'model_adaboost__n_estimators':[20,50,100],
'model_adaboost__learning_rate':[0.5,1]
}
gsearch = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=5)
gsearch.fit(X_train,y_train)
print(gsearch.grid_scores_)
print('-'*30)
print(gsearch.best_params_, gsearch.best_score_)
transform.fit(X_train, y_train)
reduce_X_train = transform.transform(X_train)
final_model = AdaBoostClassifier(n_estimators=100)
final_model.fit(reduce_X_train, y_train)
预测
reduce_X_test = transform.transform(X_test)
data = test.drop('final_response', axis=1)
predict_labels = pd.DataFrame(final_model.predict(reduce_X_test), columns=['labels'])
predict_proba = pd.DataFrame(final_model.predict_proba(reduce_X_test), columns=['noproba', 'yesproba'])
predict_pd = pd.concat((data, predict_labels, predict_proba), axis=1)
accuracy_score(y_test, predict_labels)
predict_pd.to_excel('order_predict_result.xlsx', 'Sheet1')
总结与思考
制定了营销响应率不低于80%的KPI作为本次营销活动的绩效考核目标。
结合历史销售订单数据计算本次活动的预期收益,制定ROI目标。
基于预期的订单金额和订单数量,以及关联的用券数量和金额,申请对应的营销资源用于促销用户购买转化。
近期文章
公众号后台回复关键词“20191126”,即可获得课件资源,请在如果觉得有用,欢迎转发支持~